﻿using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using Jillzhang.GifUtility;

namespace Hxsoft
{
	/// <summary>
	/// 图像的操作类
	/// </summary>
	public class Image
	{
		#region 根据源 Image 对象返回缩略图的 Image 对象。
		/// <summary>
		/// 根据源 Image 对象返回缩略图的 Image 对象。
		/// </summary>
		/// <param name="sourceImage">源 Image 对象。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">缩放类型 </param>
		/// <returns>图像的缩略图的 Image 对象。</returns>
		public static System.Drawing.Image ResizeImage(System.Drawing.Image sourceImage, int? width, int? height, ResizeRectangleType resizeType)
		{
			Rectangle rec = new Rectangle(sourceImage.Width, sourceImage.Height);

			//根据缩放类型修改图片的宽度和高度,返回mwith, mheight.
			rec = RectangleOperation.LimitResize(rec, new Rectangle(width, height), resizeType);

			int rw = (int)Math.Ceiling(rec.Width.Value);
			int rh = (int)Math.Ceiling(rec.Height.Value);
			if (sourceImage.Width == rw && sourceImage.Height == rh) return sourceImage;

			if (sourceImage.RawFormat.Guid == ImageFormat.Gif.Guid)
			{
				try
				{
					return GifHelper.GetThumbnail(sourceImage, rw, rh);
				}
				catch (Exception err) { }
			}

			return new Bitmap(sourceImage, new Size(rw, rh));
		}

		public static bool ThumbnailCallback()
		{
			return false;
		}
		#endregion


		#region 根据图像流返回图像的缩略图的 Image 对象
		/// <summary>
		/// 根据图像流返回图像的缩略图的 Image 对象。
		/// </summary>
		/// <param name="sourceStream">源图像的 stream 对象。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">图片缩放的类型。</param>
		/// <returns>图像的缩略图的 Image 对象。</returns>
		public static System.Drawing.Image ResizeImage(Stream sourceStream, int? width, int? height, ResizeRectangleType resizeType)
		{
			return ResizeImage(System.Drawing.Image.FromStream(sourceStream), width, height, resizeType);
		}
		#endregion


		#region 根据图像路径返回图像的缩略图的 Image 对象。
		/// <summary>
		/// 根据图像路径返回图像的缩略图的 Image 对象。
		/// </summary>
		/// <param name="sourcePath">源图像的路径。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">图片缩放的类型。</param>
		/// <returns>图像的缩略图的 Image 对象。</returns>
		public static System.Drawing.Image ResizeImage(string sourcePath, int? width, int? height, ResizeRectangleType resizeType)
		{
			return ResizeImage(System.Drawing.Image.FromFile(sourcePath), width, height, resizeType);
		}
		#endregion


		#region 根据源图像的路径生成图像的缩略图，并保存成文件形式返回缩略图的路径。
		/// <summary>
		/// 根据源图像的路径生成图像的缩略图，并保存成文件形式返回缩略图的路径。
		/// </summary>
		/// <param name="image">源图像。</param>
		/// <param name="targetPath">保存的缩略图的路径。</param>
		/// <param name="format">此 Image 的 ImageFormat。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">图片缩放的类型。</param>
		/// <returns>生成并保存的缩略图的路径。</returns>
		public static string ResizeImage(System.Drawing.Image image, string targetPath, System.Drawing.Imaging.ImageFormat format, int? width, int? height, ResizeRectangleType resizeType)
		{
			System.Drawing.Image newImage = ResizeImage(image, width, height, resizeType);
			newImage.Save(targetPath, format);
			return targetPath;
		}

		/// <summary>
		/// 根据源图像的路径生成图像的缩略图，并保存成文件形式返回缩略图的路径。
		/// </summary>
		/// <param name="image">源图像。</param>
		/// <param name="targetPath">保存的缩略图的路径。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">图片缩放的类型。</param>
		/// <returns>生成并保存的缩略图的路径。</returns>
		public static string ResizeImage(System.Drawing.Image image, string targetPath, int? width, int? height, ResizeRectangleType resizeType)
		{
			return ResizeImage(image, targetPath, System.Drawing.Imaging.ImageFormat.Jpeg, width, height, resizeType);
		}


		/// <summary>
		/// 根据源图像的路径生成图像的缩略图，并保存成文件形式返回缩略图的路径。
		/// </summary>
		/// <param name="sourcePath">源图像的路径。</param>
		/// <param name="targetPath">保存的缩略图的路径。</param>
		/// <param name="format">此 Image 的 ImageFormat。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">图片缩放的类型。</param>
		/// <returns>生成并保存的缩略图的路径。</returns>
		public static string ResizeImage(string sourcePath, string targetPath, System.Drawing.Imaging.ImageFormat format, int? width, int? height, ResizeRectangleType resizeType)
		{
			System.Drawing.Image image = ResizeImage(sourcePath, width, height, resizeType);
			image.Save(targetPath, format);
			return targetPath;
		}

		/// <summary>
		/// 根据源图像的路径生成图像的缩略图，并保存成文件形式返回缩略图的路径。
		/// </summary>
		/// <param name="sourcePath">源图像的路径。</param>
		/// <param name="targetPath">保存的缩略图的路径。</param>
		/// <param name="width">缩略图的宽度。</param>
		/// <param name="height">缩略图的高度。</param>
		/// <param name="resizeType">图片缩放的类型。</param>
		/// <returns>生成并保存的缩略图的路径。</returns>
		public static string ResizeImage(string sourcePath, string targetPath, int? width, int? height, ResizeRectangleType resizeType)
		{
			return ResizeImage(sourcePath, targetPath, System.Drawing.Imaging.ImageFormat.Jpeg, width, height, resizeType);
		}
		#endregion
	}
}
